package cn.shujuhai.cms.controller.elfinder;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.shujuhai.cms.service.impl.ElfinderServiceImpl;
import cn.shujuhai.common.aop.SysLog;
import lombok.RequiredArgsConstructor;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;

/**
 * @Author: zhangDeZhong
 * @Date: 2024/12/5 12:01
 * @Description: 提供静态文件管理elfinder的操作接口
 **/
@RestController
@SaCheckLogin
@RequestMapping("/elfinder")
@SaCheckPermission(value = "temp_admin")
@RequiredArgsConstructor
public class ElfinderController {

    private final ElfinderServiceImpl elfinderServiceImpl;

    /**
     * elfinder打开文件夹
     *
     */
    @SysLog(value = "静态模板文件管理", operationType = "", module = "模板模块")
    @GetMapping("/connector")
    public ResponseEntity<?> elfinderConnector(@RequestParam Map<String, String> params, @RequestParam(value = "targets[]", defaultValue = "") List<String> targets) throws IOException {
        Map<String, Object> response = elfinderServiceImpl.handleRequest(params, targets);
        return new ResponseEntity<>(response, HttpStatus.OK);
    }

    /**
     * 上传文件
     *
     */
    @SysLog(value = "静态文件模板管理上传文件", operationType = "上传文件", module = "模板模块")
    @PostMapping("/connector")
    public ResponseEntity<?> elfinderConnector(@RequestParam Map<String, String> params, @RequestParam("upload[]") MultipartFile[] files) throws IOException {
        Map<String, Object> response = elfinderServiceImpl.uploadFile(params, files);
        return new ResponseEntity<>(response, HttpStatus.OK);
    }


    /**
     * 处理缩略图请求
     *
     */
    @GetMapping("/thumbnail")
    public ResponseEntity<byte[]> getThumbnail(@RequestParam("p") String filePath) throws IOException {


        // 将编码后的路径转换为 Path 对象
        Path path = Paths.get(filePath);

        // 检查文件是否存在并且是图片类型
        if (Files.exists(path) && Files.isRegularFile(path) && isImageFile(path)) {
            // 使用 Thumbnailator 生成缩略图
            byte[] thumbnail = generateThumbnail(path);

            // 返回缩略图
            return ResponseEntity.ok()
                    .contentType(MediaType.IMAGE_JPEG) // 假设是 JPEG 格式
                    .body(thumbnail);
        } else {
            // 返回 404 Not Found，如果文件不存在或不是图片
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
        }
    }

    /**
     * 判断是否是图片
     *
     */
    private boolean isImageFile(Path path) {
        String mimeType = null;
        try {
            mimeType = Files.probeContentType(path);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mimeType != null && mimeType.startsWith("image");
    }

    /**
     * 处理文件访问请求
     *
     */
    @SysLog(value = "静态文件模板管理文件访问", operationType = "访问文件", module = "模板模块")
    @GetMapping("/virtualproxy")
    public ResponseEntity<byte[]> virtualProxy(@RequestParam("p") String filePath) throws IOException {
        // 文件路径转换，如果路径包含反斜杠等需要转换成标准路径
        Path path = Paths.get(filePath);
        if (Files.exists(path) && Files.isReadable(path)) {
            byte[] fileContent = Files.readAllBytes(path);
            // 如果是 JSON 文件，手动设置 Content-Type 为 application/json
            String contentType = Files.probeContentType(path);
            if (contentType == null || contentType.equals("application/octet-stream")) {
                contentType = "application/json";  // 设置 JSON 文件的 MIME 类型
            }
            return ResponseEntity.ok()
                    .header("Content-Type", contentType)
                    .body(fileContent);
        } else {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
        }
    }

    /**
     * 缩略图设置
     *
     */
    private byte[] generateThumbnail(Path path) throws IOException {
        // 设定缩略图的大小
        int width = 100; // 设置缩略图宽度
        int height = 100; // 设置缩略图高度

        // 使用 Thumbnailator 创建缩略图
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        // 生成缩略图并将其写入输出流
        Thumbnails.of(path.toFile())  // 加载原图
                .size(width, height)    // 设置缩略图大小
                .outputFormat("jpg")    // 输出格式（可以根据需要设置）
                .toOutputStream(outputStream);  // 写入输出流

        // 获取字节数组
        return outputStream.toByteArray();
    }
}
